/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ar.com.s21.poo.dao;

import ar.com.s21.poo.exception.GestionarException;
import ar.com.s21.poo.model.Producto;
import ar.com.s21.poo.model.TipoProducto;
import ar.com.s21.poo.model.Usuario;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Honey
 */
public class ProductoDAO implements GenericDAO<Producto> {

    /**
     *
     * @param producto
     * @return
     * @throws SQLException
     * @throws GestionarException
     */
    @Override
    public boolean add(Producto producto) throws SQLException, GestionarException {
        PreparedStatement preparedStatement = null;
        boolean insertStatus = false;

        String insertProducto = "INSERT INTO PRODUCTO (codigo,descripcion,stock_minimo,stock_actual,precio,id_tipo_producto,vigente) VALUES (?,?,?,?,?,?,?)";


        try {

            preparedStatement = MySQLConnection.getInstance().preparedStatement(insertProducto);

            preparedStatement.setString(1, producto.getCodigoProducto());
            preparedStatement.setString(2, producto.getDescripcion());
            preparedStatement.setInt(3, producto.getStockMinimo());
            preparedStatement.setInt(4, producto.getStockActual());
            preparedStatement.setDouble(5, producto.getPrecio());
            preparedStatement.setInt(6, producto.getTipoProducto().getIdTipoProducto());
            preparedStatement.setBoolean(7, producto.isVigente());

            // execute insert SQL stetement
            preparedStatement.execute();
            insertStatus = true;


        } catch (SQLException e) {
            try {
                throw new GestionarException("Error al insertar producto");
            } catch (GestionarException ex) {
                Logger.getLogger(ProductoDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
            System.out.println(e.getMessage());

        } finally {

            if (preparedStatement != null) {
                preparedStatement.close();
            }
        }
        return insertStatus;
    }

    /**
     *
     * @param t
     * @throws SQLException
     */
    @Override
    public void update(Producto t) throws SQLException {
        PreparedStatement preparedStatement = null;

        String actualizarProducto = "update producto set descripcion=?, vigente=?, stock_minimo=?,stock_actual=?, precio=?,id_tipo_producto=? where codigo=?";


        try {
            preparedStatement = MySQLConnection.getInstance().preparedStatement(actualizarProducto);
            preparedStatement.setString(1, t.getDescripcion());
            preparedStatement.setBoolean(2, t.isVigente());
            preparedStatement.setInt(3, t.getStockMinimo());
            preparedStatement.setInt(4, t.getStockActual());
            preparedStatement.setDouble(5, t.getPrecio());
            preparedStatement.setInt(6, t.getTipoProducto().getIdTipoProducto());
            preparedStatement.setString(7, t.getCodigoProducto());

            preparedStatement.executeUpdate();

        } catch (SQLException e) {

            System.out.println(e.getMessage());


        } finally {

            if (preparedStatement != null) {

                preparedStatement.close();
            }
        }
    }

    /**
     *
     * @param t
     * @return
     * @throws SQLException
     */
    @Override
    public boolean delete(Producto t) throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    /**
     *
     * @return
     * @throws SQLException
     */
    public List<Producto> listarProductos() throws SQLException {
        PreparedStatement preparedStatement = null;
        List<Producto> lstProductos = new ArrayList<Producto>();
        Producto producto = null;


        String buscarProductosSQL = "SELECT * FROM producto";

        try {
            preparedStatement = MySQLConnection.getInstance().preparedStatement(buscarProductosSQL);

            ResultSet result = preparedStatement.executeQuery();



            while (result.next()) {
                producto = new Producto();
                producto.setCodigoProducto(result.getString("codigo"));
                producto.setDescripcion(result.getString("descripcion"));
                producto.setPrecio(result.getInt("precio"));
                producto.setId_producto(result.getInt("id_producto"));

                lstProductos.add(producto);
            }

        } catch (SQLException e) {

            System.out.println(e.getMessage());


        } finally {

            if (preparedStatement != null) {
                preparedStatement.close();
            }
        }
        return lstProductos;


    }

    /**
     *
     * @return @throws GestionarException 
     * @throws GestionarException
     * @throws SQLException
     */
    public List<Producto> listarProductosFaltantes() throws GestionarException, SQLException {
        PreparedStatement preparedStatement = null;
        List<Producto> lstProductosFaltantes = new ArrayList<Producto>();
        Producto producto = null;


        String buscarProductosSQL = "SELECT * FROM producto where stock_actual <= stock_minimo and vigente=true";

        try {
            preparedStatement = MySQLConnection.getInstance().preparedStatement(buscarProductosSQL);

            ResultSet result = preparedStatement.executeQuery();



            while (result.next()) {
                producto = new Producto();
                producto.setCodigoProducto(result.getString("codigo"));
                producto.setDescripcion(result.getString("descripcion"));
                producto.setPrecio(result.getInt("precio"));
                producto.setId_producto(result.getInt("id_producto"));
                producto.setStockActual(result.getInt("stock_actual"));
                producto.setStockMinimo(result.getInt("stock_minimo"));

                lstProductosFaltantes.add(producto);
            }


        } catch (SQLException e) {

            System.out.println(e.getMessage());


        } finally {

            if (preparedStatement != null) {
                preparedStatement.close();
            }
        }
        return lstProductosFaltantes;


    }

    /**
     *
     * @param descripcion
     * @return
     * @throws GestionarException
     * @throws SQLException
     */
    public boolean existeProducto(String descripcion) throws GestionarException, SQLException {
        PreparedStatement preparedStatement = null;
        boolean existeProducto = false;


        String buscarProductosSQL = "SELECT * FROM producto where descripcion=? ";

        try {
            preparedStatement = MySQLConnection.getInstance().preparedStatement(buscarProductosSQL);

            preparedStatement.setString(1, descripcion);

            ResultSet result = preparedStatement.executeQuery();



            while (result.next()) {
                existeProducto = true;
            }




        } catch (SQLException e) {

            System.out.println(e.getMessage());
            throw new GestionarException("Eror de base de datos no esperado");

        } finally {

            if (preparedStatement != null) {
                preparedStatement.close();
            }
        }
        return existeProducto;

    }

    private void incrementarCantidad(String descripcion) throws GestionarException, SQLException {
        PreparedStatement preparedStatement = null;



        String incrementarCantidad = "UPDATE PRODUCTO set stock_actual=stock_actual+1 where descripcion='?' ";

        try {
            preparedStatement = MySQLConnection.getInstance().preparedStatement(incrementarCantidad);

            preparedStatement.setString(1, descripcion);

            ResultSet result = preparedStatement.executeQuery();

        } catch (SQLException e) {

            System.out.println(e.getMessage());
            throw new GestionarException("Eror de base de datos no esperado");

        } finally {

            if (preparedStatement != null) {
                preparedStatement.close();
            }
        }
    }

    /**
     *
     * @param codigoProducto
     * @return
     * @throws SQLException
     */
    public Producto buscarProducto(String codigoProducto) throws SQLException {

        PreparedStatement preparedStatement = null;
        Producto p = null;
        TipoProducto tp;
        String buscarProductoPorCodigo = "SELECT * FROM producto where codigo=?";

        try {
            preparedStatement = MySQLConnection.getInstance().preparedStatement(buscarProductoPorCodigo);
            preparedStatement.setString(1, codigoProducto);
            ResultSet result = preparedStatement.executeQuery();

            while (result.next()) {
                p = new Producto();
                p.setDescripcion(result.getString("descripcion"));
                p.setPrecio(result.getDouble("precio"));
                p.setCodigoProducto(result.getString("codigo"));
                p.setStockMinimo(result.getInt("stock_minimo"));
                p.setStockActual(result.getInt("stock_actual"));
                p.setVigente(result.getBoolean("vigente"));
                tp = new TipoProducto();
                tp.setIdTipoProducto(result.getInt("id_tipo_producto"));
                tp.setTipoProducto(result.getString("tipo_producto"));
                p.setTipoProducto(tp);
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        } finally {
            if (preparedStatement != null) {
                preparedStatement.close();
            }
        }
        return p;
    }
}